from django.core.validators import RegexValidator
from django.db import models

#创建一个基类，因为每个表都需要这个字段
class ActiveBaseModel(models.Model):
    # 状态 ：1 表示激活 0表示删除 用于管理员做逻辑删除，后续通过：数据对象.get_active_display()得到中文
    active = models.SmallIntegerField(verbose_name="激活状态",
                                      choices=((1, "激活"), (0, "删除"),), default=1)
    class Meta:
        abstract = True  #防止jango把基类生成一个数据库的表

# Create your models here.
#管理员表
class Administrator(ActiveBaseModel):
    username = models.CharField(max_length=32,verbose_name="用户名",db_index=True)
    password = models.CharField(max_length=64,verbose_name="密码")
    mobile =  models.CharField(max_length=11,verbose_name="手机号")
    # 创建管理员需要的日期 auto_now_add只有创建时更新，更新数据时不更新
    create_date = models.DateTimeField(verbose_name="创建日期",auto_now_add=True)


#用户表VIP级别表
class Level(ActiveBaseModel):
    # 级别 每个级别有不同的折扣
    title = models.CharField(verbose_name="标题",max_length=32)
    #打几折 80
    percent = models.IntegerField(verbose_name="折扣",help_text = "填入0-100整数表示百分比，如：90为90%")
    #为了防止页面输出对象时的显示问题 我们修改为默认显示 title名字
    def __str__(self):
        return self.title

#用户表 (客户与管理员有不同的字段，比如分级别，所以不放在一个表，如果是相同字段可以放一个表）
class Customer(ActiveBaseModel):
    username = models.CharField(max_length=32,verbose_name="用户名",db_index=True)
    password = models.CharField(max_length=64,verbose_name="密码")
    mobile =  models.CharField(max_length=11,verbose_name="手机号",validators=[RegexValidator(r'^1[358]\d{9}$', '手机号需要是13or5or8开头的11位数字')])
    #账户余额,没个客户有多少钱 最大10位数，小数点后两位
    balance = models.DecimalField(verbose_name="账户余额",default=0,max_digits=10,decimal_places=2)
    #客户的级别：
    level = models.ForeignKey(verbose_name="外键(VIP级别表)",to = "Level",on_delete=models.CASCADE,limit_choices_to={"active":1})
    #客户是谁创建的 客户是邀请制度，需要看是那个管理员创建的客户账户
    creator = models.ForeignKey(verbose_name="创建者",to = "Administrator",on_delete=models.CASCADE)
    #创建日期
    create_date = models.DateTimeField(verbose_name="创建日期", auto_now_add=True)

#价格策略 定义商品价格与数量 下单的越多约便宜
class PricePolicy(models.Model):
    '''
    1000范围内,5
    2000范围内,10
    '''
    #价格
    price = models.DecimalField(verbose_name="价格", default=0, max_digits=10, decimal_places=2)
    # 数量
    count = models.IntegerField(verbose_name="数量")

# 订单表
class Order(ActiveBaseModel):
    charge_type_class_mapping = {
        3: "success",
        2: "danger",
        1: "default",
        4: "info",
        5: "primary",
    }
    #订单的4个状态
    status = models.SmallIntegerField(verbose_name="订单执行状态",
                                      choices=((1, "待执行"), (2, "正在执行"),(3, "已完成"),(4, "失败"),(5,"已撤单"),), default=1)
    #唯一订单号
    oid = models.CharField(max_length=64,verbose_name="订单号",unique=True)
    # 订单的视频地址，数量 models.URLField() 是专门用于存储 URL 地址 的字段类型，可添加其他参数：help_text、verbose_name 等
    url = models.URLField(verbose_name="视频地址",db_index=True,max_length=300)
    count = models.IntegerField(verbose_name="下单数量")
    # 算出来多少钱（原价），钱数据放这里，防止后面改价格策略对不上账
    price = models.DecimalField(verbose_name="计算的总价格(原价)", default=0, max_digits=10, decimal_places=2)
    #按级别折扣后的价格
    real_price = models.DecimalField(verbose_name="实际价格(原价*折扣)", default=0, max_digits=10, decimal_places=2)
    #关联客户表，设下的单
    customer = models.ForeignKey(verbose_name="客户(外键)",on_delete=models.CASCADE,to = "Customer")
    #备注信息
    memo = models.TextField(verbose_name="客户(外键)",null = True,blank=True)
    create_datetime = models.DateTimeField(verbose_name="订单创建日期", auto_now_add=True)
    #为了对比没有刷之前是多少 当平台播量上万一般用 1.2W 所以不能用整形 刷完以后需要1-2小时才会涨
    old_view_count = models.CharField(verbose_name="原播放量", max_length=32,default="0")

# 交易记录的表 充值后消费，那么什么时候充值多少钱，消费多少钱,订单操作都需要记录
class TransactionRecord(ActiveBaseModel):
   # 为了引入bootstrap框架的样式，展示颜色，
    charge_type_class_mapping = {
        1: "success",
        2: "danger",
        3: "default",
        4: "info",
        5: "primary",
    }
    # 交易的类型，扣款：是为了防止有人违规操作，一般不用  创建订单：下单的时候创建订单时创建交易记录；删除订单：订单不再展示
    charge_type_choices = ((1, "充值"), (2, "扣款"),(3, "创建订单"),(4, "删除订单"),(5, "撤销订单"),)
    charge_type = models.SmallIntegerField(verbose_name="交易类型",
                                      choices=((1, "充值"), (2, "扣款"),(3, "创建订单"),(4, "删除订单"),(5, "撤销订单"),))

    #下单的 人和多少钱（由谁产生记录） 交易记录绑定的客户
    customer = models.ForeignKey(verbose_name="客户(交易记录外键)", to="Customer", on_delete=models.CASCADE)
    amount = models.DecimalField(verbose_name="金额", default=0, max_digits=10, decimal_places=2)
    #那个管理员充的值 可以为空 应为创建订单等和管理员无关
    creator = models.ForeignKey(verbose_name="管理员(交易记录外键)", to="Administrator", on_delete=models.CASCADE, null=True, blank=True)
    #创建订单，删除订单，撤销订单 需要与订单关联，我们直接把订单号写这里 后续用订单号关联
    order_oid = models.CharField(verbose_name="订单号(交易记录外键)", max_length=64, null=True, blank=True, db_index=True)
    #交易记录产生时间
    create_datetime = models.DateTimeField(verbose_name="交易时间", auto_now_add=True)
    memo = models.TextField(verbose_name="备注", null=True, blank=True)
